/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package aria.apache.commons.net;

import java.util.EventObject;

/***
 * There exists a large class of IETF protocols that work by sending an
 * ASCII text command and arguments to a server, and then receiving an
 * ASCII text reply.  For debugging and other purposes, it is extremely
 * useful to log or keep track of the contents of the protocol messages.
 * The ProtocolCommandEvent class coupled with the
 * {@link ProtocolCommandListener}
 *  interface facilitate this process.
 *
 *
 * @see ProtocolCommandListener
 * @see ProtocolCommandSupport
 ***/

public class ProtocolCommandEvent extends EventObject {
  private static final long serialVersionUID = 403743538418947240L;

  private final int __replyCode;
  private final boolean __isCommand;
  private final String __message, __command;

  /***
   * Creates a ProtocolCommandEvent signalling a command was sent to
   * the server.  ProtocolCommandEvents created with this constructor
   * should only be sent after a command has been sent, but before the
   * reply has been received.
   *
   * @param source  The source of the event.
   * @param command The string representation of the command type sent, not
   *      including the arguments (e.g., "STAT" or "GET").
   * @param message The entire command string verbatim as sent to the server,
   *        including all arguments.
   ***/
  public ProtocolCommandEvent(Object source, String command, String message) {
    super(source);
    __replyCode = 0;
    __message = message;
    __isCommand = true;
    __command = command;
  }

  /***
   * Creates a ProtocolCommandEvent signalling a reply to a command was
   * received.  ProtocolCommandEvents created with this constructor
   * should only be sent after a complete command reply has been received
   * fromt a server.
   *
   * @param source  The source of the event.
   * @param replyCode The integer code indicating the natureof the reply.
   *   This will be the protocol integer value for protocols
   *   that use integer reply codes, or the reply class constant
   *   corresponding to the reply for protocols like POP3 that use
   *   strings like OK rather than integer codes (i.e., POP3Repy.OK).
   * @param message The entire reply as received from the server.
   ***/
  public ProtocolCommandEvent(Object source, int replyCode, String message) {
    super(source);
    __replyCode = replyCode;
    __message = message;
    __isCommand = false;
    __command = null;
  }

  /***
   * Returns the string representation of the command type sent (e.g., "STAT"
   * or "GET").  If the ProtocolCommandEvent is a reply event, then null
   * is returned.
   *
   * @return The string representation of the command type sent, or null
   *         if this is a reply event.
   ***/
  public String getCommand() {
    return __command;
  }

  /***
   * Returns the reply code of the received server reply.  Undefined if
   * this is not a reply event.
   *
   * @return The reply code of the received server reply.  Undefined if
   *         not a reply event.
   ***/
  public int getReplyCode() {
    return __replyCode;
  }

  /***
   * Returns true if the ProtocolCommandEvent was generated as a result
   * of sending a command.
   *
   * @return true If the ProtocolCommandEvent was generated as a result
   * of sending a command.  False otherwise.
   ***/
  public boolean isCommand() {
    return __isCommand;
  }

  /***
   * Returns true if the ProtocolCommandEvent was generated as a result
   * of receiving a reply.
   *
   * @return true If the ProtocolCommandEvent was generated as a result
   * of receiving a reply.  False otherwise.
   ***/
  public boolean isReply() {
    return !isCommand();
  }

  /***
   * Returns the entire message sent to or received from the server.
   * Includes the line terminator.
   *
   * @return The entire message sent to or received from the server.
   ***/
  public String getMessage() {
    return __message;
  }
}
